# python:3.9.9-alpine3.15
# 使用sha256, 是为了避免"通过tag指定时偶尔发生的镜像更新导致意外的构建缓存失效甚至构建失败"的问题
FROM python@sha256:ce36ba64436cc423fec8b27ac41875e36b0d977cc85594a4cab021ee3378a1c8
# 使用构建变量, 当有内网缓存代理时可以在不调整文件本身的情况下通过docker build的参数对pip源进行修改
ARG PIP_MIRROR_URL="https://mirrors.aliyun.com/pypi/simple"
ARG APK_MIRROR_URL="https://mirrors.aliyun.com/alpine"

# apk换源
RUN sed -i "s#.*//[a-zA-Z.-]*/alpine#${APK_MIRROR_URL}#" /etc/apk/repositories && apk update
# 调整时区为中国时区
RUN apk add --no-cache tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone && apk del tzdata
# 安装常见的系统级依赖
RUN apk add --no-cache gcc musl-dev python3-dev libffi-dev openssl-dev make g++ file jq

# pip 换源
RUN mkdir ~/.pip && echo -e "[global] \ntrusted-host=$(echo ${PIP_MIRROR_URL}|sed 's#.*//\([a-zA-Z0-9:.-]*\).*#\1#') \nindex-url=${PIP_MIRROR_URL}" > ~/.pip/pip.conf

# 这里是避免加密库使用rust编译器进行安装, 这将极大地增加构建时间, 且要求上面的apk add中加入cargo, 增加镜像体积
RUN CRYPTOGRAPHY_DONT_BUILD_RUST=1 pip install 'cryptography<3.5' 
# 安装poetry, 以支持"通过poetry管理依赖"的项目
RUN pip install poetry 
RUN mkdir /opt/project
WORKDIR /opt/project
# 重点!! COPY的实际内容如果与之前缓存不一致会使缓存失效, 通过提前安装依赖来避免"与依赖指定无关的代码修改"使缓存失效的问题
COPY ./pyproject.toml ./poetry.lock ./
RUN POETRY_VIRTUALENVS_CREATE=false poetry install --no-dev --no-interaction --no-ansi

COPY ./ .
EXPOSE 5000

# 下面为定时健康检查的代码，需要在后端编写相应接口
# 在镜像的运行时中加入对外依赖的部分不是个好做法，但这里给出示例方便后续在　docker compose 中编写有关内容
# 可详见 https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck

ENV ROBOT_TOKEN="15ba4f5f-7b95-4c4c-96a9-0d2e511ae08a"
HEALTHCHECK --start-period=30s --interval=5m --timeout=10s \
    CMD if [[ $( wget -qO- http://127.0.0.1:5000/healthcheck ) == *"false"* ]] \
     ;then \  
        wget -qO- "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${ROBOT_TOKEN}" \
            --header 'Content-Type: application/json' \
            --post-data ' { "msgtype": "text", "text": { "content": "'"$(wget -qO- ip.sb) 节点 docker 容器存在不健康的情况"'" } }'  \
        return 1  \
     ;else  return 0 ; \
    fi

ENTRYPOINT ["uvicorn", "main:app", "--host=0.0.0.0", "--port=5000"]

